home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 24 / CU Amiga Magazine's Super CD-ROM 24 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-07].iso / CUCD / Utilities / vim-5.1 / src / digraph.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-25  |  12.9 KB  |  552 lines

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved    by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  */
  8.  
  9. /*
  10.  * digraph.c: code for digraphs
  11.  */
  12.  
  13. #include "vim.h"
  14.  
  15. #ifdef DIGRAPHS
  16.  
  17. static int getexactdigraph __ARGS((int, int, int));
  18. static void printdigraph __ARGS((char_u *));
  19.  
  20. static char_u    (*digraphnew)[3];        /* pointer to added digraphs */
  21. static int    digraphcount = 0;        /* number of added digraphs */
  22.  
  23. /*
  24.  * Note: Characters marked with XX are not included literally, because some
  25.  * compilers cannot handle them (Amiga SAS/C is the most picky one).
  26.  */
  27. #if (defined(MSDOS) || defined(WIN32) || defined(OS2)) && !defined(USE_GUI_WIN32)
  28. char_u    digraphdefault[][3] =        /* standard MSDOS digraphs */
  29.        {{'C', ',', 128},    /* ~@ XX */
  30.     {'u', '"', 129},    /*  */
  31.     {'e', '\'', 130},    /* ‚ */
  32.     {'a', '^', 131},    /* ƒ */
  33.     {'a', '"', 132},    /* „ */
  34.     {'a', '`', 133},    /* … */
  35.     {'a', '@', 134},    /* † */
  36.     {'c', ',', 135},    /* ~G XX */
  37.     {'e', '^', 136},    /* ~H XX */
  38.     {'e', '"', 137},    /* ‰ */
  39.     {'e', '`', 138},    /* Š */
  40.     {'i', '"', 139},    /* ‹ */
  41.     {'i', '^', 140},    /* Œ */
  42.     {'i', '`', 141},    /*  */
  43.     {'A', '"', 142},    /* Ž */
  44.     {'A', '@', 143},    /*  */
  45.     {'E', '\'', 144},    /*  */
  46.     {'a', 'e', 145},    /* ‘ */
  47.     {'A', 'E', 146},    /* ’ */
  48.     {'o', '^', 147},    /* “ */
  49.     {'o', '"', 148},    /* ” */
  50.     {'o', '`', 149},    /* • */
  51.     {'u', '^', 150},    /* – */
  52.     {'u', '`', 151},    /* — */
  53.     {'y', '"', 152},    /* ˜ */
  54.     {'O', '"', 153},    /* ™ */
  55.     {'U', '"', 154},    /* š */
  56.     {'c', '|', 155},    /* › */
  57.     {'$', '$', 156},    /* œ */
  58.     {'Y', '-', 157},    /* ~] XX */
  59.     {'P', 't', 158},    /* ž */
  60.     {'f', 'f', 159},    /* Ÿ */
  61.     {'a', '\'', 160},    /*   */
  62.     {'i', '\'', 161},    /* ¡ */
  63.     {'o', '\'', 162},    /* ¢ */
  64.     {'u', '\'', 163},    /* x XX */
  65.     {'n', '~', 164},    /* ¤ */
  66.     {'N', '~', 165},    /* ¥ */
  67.     {'a', 'a', 166},    /* ¦ */
  68.     {'o', 'o', 167},    /* § */
  69.     {'~', '?', 168},    /* ¨ */
  70.     {'-', 'a', 169},    /* © */
  71.     {'a', '-', 170},    /* ª */
  72.     {'1', '2', 171},    /* « */
  73.     {'1', '4', 172},    /* ¬ */
  74.     {'~', '!', 173},    /* ­ */
  75.     {'<', '<', 174},    /* ® */
  76.     {'>', '>', 175},    /* ¯ */
  77.  
  78.     {'s', 's', 225},    /* á */
  79.     {'j', 'u', 230},    /* æ */
  80.     {'o', '/', 237},    /* í */
  81.     {'+', '-', 241},    /* ñ */
  82.     {'>', '=', 242},    /* ò */
  83.     {'<', '=', 243},    /* ó */
  84.     {':', '-', 246},    /* ö */
  85.     {'~', '~', 247},    /* ÷ */
  86.     {'~', 'o', 248},    /* ø */
  87.     {'2', '2', 253},    /* ý */
  88.     {NUL, NUL, NUL}
  89.     };
  90.  
  91. #else    /* !MSDOS && !WIN32 */
  92. # ifdef __MINT__
  93. char_u    digraphdefault[][3] =        /* standard ATARI digraphs */
  94.        {{'C', ',', 128},    /* ~@ */
  95.     {'u', '"', 129},    /*  */
  96.     {'e', '\'', 130},    /* ‚ */
  97.     {'a', '^', 131},    /* ƒ */
  98.     {'a', '"', 132},    /* „ */
  99.     {'a', '`', 133},    /* … */
  100.     {'a', '@', 134},    /* † */
  101.     {'c', ',', 135},    /* ~G */
  102.     {'e', '^', 136},    /* ~H */
  103.     {'e', '"', 137},    /* ‰ */
  104.     {'e', '`', 138},    /* Š */
  105.     {'i', '"', 139},    /* ‹ */
  106.     {'i', '^', 140},    /* Œ */
  107.     {'i', '`', 141},    /*  */
  108.     {'A', '"', 142},    /* Ž */
  109.     {'A', '@', 143},    /*  */
  110.     {'E', '\'', 144},    /*  */
  111.     {'a', 'e', 145},    /* ‘ */
  112.     {'A', 'E', 146},    /* ’ */
  113.     {'o', '^', 147},    /* “ */
  114.     {'o', '"', 148},    /* ” */
  115.     {'o', '`', 149},    /* • */
  116.     {'u', '^', 150},    /* – */
  117.     {'u', '`', 151},    /* — */
  118.     {'y', '"', 152},    /* ˜ */
  119.     {'O', '"', 153},    /* ™ */
  120.     {'U', '"', 154},    /* š */
  121.     {'c', '|', 155},    /* › */
  122.     {'$', '$', 156},    /* œ */
  123.     {'Y', '-', 157},    /* ~] */
  124.     {'s', 's', 158},    /* ž */
  125.     {'f', 'f', 159},    /* Ÿ */
  126.     {'a', '\'', 160},    /*   */
  127.     {'i', '\'', 161},    /* ¡ */
  128.     {'o', '\'', 162},    /* ¢ */
  129.     {'u', '\'', 163},    /* £ */
  130.     {'n', '~', 164},    /* ¤ */
  131.     {'N', '~', 165},    /* ¥ */
  132.     {'a', 'a', 166},    /* ¦ */
  133.     {'o', 'o', 167},    /* § */
  134.     {'~', '?', 168},    /* ¨ */
  135.     {'-', 'a', 169},    /* © */
  136.     {'a', '-', 170},    /* ª */
  137.     {'1', '2', 171},    /* « */
  138.     {'1', '4', 172},    /* ¬ */
  139.     {'~', '!', 173},    /* ­ */
  140.     {'<', '<', 174},    /* ® */
  141.     {'>', '>', 175},    /* ¯ */
  142.     {'j', 'u', 230},    /* æ */
  143.     {'o', '/', 237},    /* í */
  144.     {'+', '-', 241},    /* ñ */
  145.     {'>', '=', 242},    /* ò */
  146.     {'<', '=', 243},    /* ó */
  147.     {':', '-', 246},    /* ö */
  148.     {'~', '~', 247},    /* ÷ */
  149.     {'~', 'o', 248},    /* ø */
  150.     {'2', '2', 253},    /* ý */
  151.     {NUL, NUL, NUL}
  152.     };
  153.  
  154. # else    /* !__MINT__ */
  155. #  ifdef HPUX_DIGRAPHS
  156.  
  157. char_u    digraphdefault[][3] =        /* different HPUX digraphs */
  158.        {{'A', '`', 161},    /* ¡ */
  159.     {'A', '^', 162},    /* ¢ */
  160.     {'E', '`', 163},    /* £ */
  161.     {'E', '^', 164},    /* ¤ */
  162.     {'E', '"', 165},    /* ¥ */
  163.     {'I', '^', 166},    /* ¦ */
  164.     {'I', '"', 167},    /* § */
  165.     {'\'', '\'', 168},    /* ¨ */
  166.     {'`', '`', 169},    /* © */
  167.     {'^', '^', 170},    /* ª */
  168.     {'"', '"', 171},    /* « */
  169.     {'~', '~', 172},    /* ¬ */
  170.     {'U', '`', 173},    /* ­ */
  171.     {'U', '^', 174},    /* ® */
  172.     {'L', '=', 175},    /* ¯ */
  173.     {'~', '_', 176},    /* ° */
  174.     {'Y', '\'', 177},    /* ± */
  175.     {'y', '\'', 178},    /* ² */
  176.     {'~', 'o', 179},    /* ³ */
  177.     {'C', ',', 180},    /* ´ */
  178.     {'c', ',', 181},    /* µ */
  179.     {'N', '~', 182},    /* ¶ */
  180.     {'n', '~', 183},    /* · */
  181.     {'~', '!', 184},    /* ¸ */
  182.     {'~', '?', 185},    /* ¹ */
  183.     {'o', 'x', 186},    /* º */
  184.     {'L', '-', 187},    /* » */
  185.     {'Y', '=', 188},    /* ¼ */
  186.     {'p', 'p', 189},    /* ½ */
  187.     {'f', 'l', 190},    /* ¾ */
  188.     {'c', '|', 191},    /* ¿ */
  189.     {'a', '^', 192},    /* À */
  190.     {'e', '^', 193},    /* Á */
  191.     {'o', '^', 194},    /* Â */
  192.     {'u', '^', 195},    /* Ã */
  193.     {'a', '\'', 196},    /* Ä */
  194.     {'e', '\'', 197},    /* Å */
  195.     {'o', '\'', 198},    /* Æ */
  196.     {'u', '\'', 199},    /* Ç */
  197.     {'a', '`', 200},    /* È */
  198.     {'e', '`', 201},    /* É */
  199.     {'o', '`', 202},    /* Ê */
  200.     {'u', '`', 203},    /* Ë */
  201.     {'a', '"', 204},    /* Ì */
  202.     {'e', '"', 205},    /* Í */
  203.     {'o', '"', 206},    /* Î */
  204.     {'u', '"', 207},    /* Ï */
  205.     {'A', 'o', 208},    /* Ð */
  206.     {'i', '^', 209},    /* Ñ */
  207.     {'O', '/', 210},    /* Ò */
  208.     {'A', 'E', 211},    /* Ó */
  209.     {'a', 'o', 212},    /* Ô */
  210.     {'i', '\'', 213},    /* Õ */
  211.     {'o', '/', 214},    /* Ö */
  212.     {'a', 'e', 215},    /* × */
  213.     {'A', '"', 216},    /* Ø */
  214.     {'i', '`', 217},    /* Ù */
  215.     {'O', '"', 218},    /* Ú */
  216.     {'U', '"', 219},    /* Û */
  217.     {'E', '\'', 220},    /* Ü */
  218.     {'i', '"', 221},    /* Ý */
  219.     {'s', 's', 222},    /* Þ */
  220.     {'O', '^', 223},    /* ß */
  221.     {'A', '\'', 224},    /* à */
  222.     {'A', '~', 225},    /* á */
  223.     {'a', '~', 226},    /* â */
  224.     {'D', '-', 227},    /* ã */
  225.     {'d', '-', 228},    /* ä */
  226.     {'I', '\'', 229},    /* å */
  227.     {'I', '`', 230},    /* æ */
  228.     {'O', '\'', 231},    /* ç */
  229.     {'O', '`', 232},    /* è */
  230.     {'O', '~', 233},    /* é */
  231.     {'o', '~', 234},    /* ê */
  232.     {'S', '~', 235},    /* ë */
  233.     {'s', '~', 236},    /* ì */
  234.     {'U', '\'', 237},    /* í */
  235.     {'Y', '"', 238},    /* î */
  236.     {'y', '"', 239},    /* ï */
  237.     {'p', '-', 240},    /* ð */
  238.     {'p', '~', 241},    /* ñ */
  239.     {'~', '.', 242},    /* ò */
  240.     {'j', 'u', 243},    /* ó */
  241.     {'P', 'p', 244},    /* ô */
  242.     {'3', '4', 245},    /* õ */
  243.     {'-', '-', 246},    /* ö */
  244.     {'1', '4', 247},    /* ÷ */
  245.     {'1', '2', 248},    /* ø */
  246.     {'a', '_', 249},    /* ù */
  247.     {'o', '_', 250},    /* ú */
  248.     {'<', '<', 251},    /* û */
  249.     {'x', 'x', 252},    /* ü */
  250.     {'>', '>', 253},    /* ý */
  251.     {'+', '-', 254},    /* þ */
  252.     {'n', 'u', 255},    /* x XX */
  253.     {NUL, NUL, NUL}
  254.     };
  255.  
  256. #  else    /* !HPUX_DIGRAPHS */
  257.  
  258. char_u    digraphdefault[][3] =        /* standard ISO digraphs */
  259.        {{'~', '!', 161},    /* ¡ */
  260.     {'c', '|', 162},    /* ¢ */
  261.     {'$', '$', 163},    /* £ */
  262.     {'o', 'x', 164},    /* ¤ */
  263.     {'Y', '-', 165},    /* ¥ */
  264.     {'|', '|', 166},    /* ¦ */
  265.     {'p', 'a', 167},    /* § */
  266.     {'"', '"', 168},    /* ¨ */
  267.     {'c', 'O', 169},    /* © */
  268.     {'a', '-', 170},    /* ª */
  269.     {'<', '<', 171},    /* « */
  270.     {'-', ',', 172},    /* ¬ */
  271.     {'-', '-', 173},    /* ­ */
  272.     {'r', 'O', 174},    /* ® */
  273.     {'-', '=', 175},    /* ¯ */
  274.     {'~', 'o', 176},    /* ° */
  275.     {'+', '-', 177},    /* ± */
  276.     {'2', '2', 178},    /* ² */
  277.     {'3', '3', 179},    /* ³ */
  278.     {'\'', '\'', 180},    /* ´ */
  279.     {'j', 'u', 181},    /* µ */
  280.     {'p', 'p', 182},    /* ¶ */
  281.     {'~', '.', 183},    /* · */
  282.     {',', ',', 184},    /* ¸ */
  283.     {'1', '1', 185},    /* ¹ */
  284.     {'o', '-', 186},    /* º */
  285.     {'>', '>', 187},    /* » */
  286.     {'1', '4', 188},    /* ¼ */
  287.     {'1', '2', 189},    /* ½ */
  288.     {'3', '4', 190},    /* ¾ */
  289.     {'~', '?', 191},    /* ¿ */
  290.     {'A', '`', 192},    /* À */
  291.     {'A', '\'', 193},    /* Á */
  292.     {'A', '^', 194},    /* Â */
  293.     {'A', '~', 195},    /* Ã */
  294.     {'A', '"', 196},    /* Ä */
  295.     {'A', '@', 197},    /* Å */
  296.     {'A', 'E', 198},    /* Æ */
  297.     {'C', ',', 199},    /* Ç */
  298.     {'E', '`', 200},    /* È */
  299.     {'E', '\'', 201},    /* É */
  300.     {'E', '^', 202},    /* Ê */
  301.     {'E', '"', 203},    /* Ë */
  302.     {'I', '`', 204},    /* Ì */
  303.     {'I', '\'', 205},    /* Í */
  304.     {'I', '^', 206},    /* Î */
  305.     {'I', '"', 207},    /* Ï */
  306.     {'D', '-', 208},    /* Ð */
  307.     {'N', '~', 209},    /* Ñ */
  308.     {'O', '`', 210},    /* Ò */
  309.     {'O', '\'', 211},    /* Ó */
  310.     {'O', '^', 212},    /* Ô */
  311.     {'O', '~', 213},    /* Õ */
  312.     {'O', '"', 214},    /* Ö */
  313.     {'/', '\\', 215},    /* × */
  314.     {'O', '/', 216},    /* Ø */
  315.     {'U', '`', 217},    /* Ù */
  316.     {'U', '\'', 218},    /* Ú */
  317.     {'U', '^', 219},    /* Û */
  318.     {'U', '"', 220},    /* Ü */
  319.     {'Y', '\'', 221},    /* Ý */
  320.     {'I', 'p', 222},    /* Þ */
  321.     {'s', 's', 223},    /* ß */
  322.     {'a', '`', 224},    /* à */
  323.     {'a', '\'', 225},    /* á */
  324.     {'a', '^', 226},    /* â */
  325.     {'a', '~', 227},    /* ã */
  326.     {'a', '"', 228},    /* ä */
  327.     {'a', '@', 229},    /* å */
  328.     {'a', 'e', 230},    /* æ */
  329.     {'c', ',', 231},    /* ç */
  330.     {'e', '`', 232},    /* è */
  331.     {'e', '\'', 233},    /* é */
  332.     {'e', '^', 234},    /* ê */
  333.     {'e', '"', 235},    /* ë */
  334.     {'i', '`', 236},    /* ì */
  335.     {'i', '\'', 237},    /* í */
  336.     {'i', '^', 238},    /* î */
  337.     {'i', '"', 239},    /* ï */
  338.     {'d', '-', 240},    /* ð */
  339.     {'n', '~', 241},    /* ñ */
  340.     {'o', '`', 242},    /* ò */
  341.     {'o', '\'', 243},    /* ó */
  342.     {'o', '^', 244},    /* ô */
  343.     {'o', '~', 245},    /* õ */
  344.     {'o', '"', 246},    /* ö */
  345.     {':', '-', 247},    /* ÷ */
  346.     {'o', '/', 248},    /* ø */
  347.     {'u', '`', 249},    /* ù */
  348.     {'u', '\'', 250},    /* ú */
  349.     {'u', '^', 251},    /* û */
  350.     {'u', '"', 252},    /* ü */
  351.     {'y', '\'', 253},    /* ý */
  352.     {'i', 'p', 254},    /* þ */
  353.     {'y', '"', 255},    /* x XX */
  354.     {NUL, NUL, NUL}
  355.     };
  356.  
  357. #  endif    /* !HPUX_DIGRAPHS */
  358. # endif    /* !__MINT__ */
  359. #endif    /* !MSDOS && !WIN32 */
  360.  
  361. /*
  362.  * handle digraphs after typing a character
  363.  */
  364.     int
  365. do_digraph(c)
  366.     int        c;
  367. {
  368.     static int    backspaced;    /* character before K_BS */
  369.     static int    lastchar;    /* last typed character */
  370.  
  371.     if (c == -1)        /* init values */
  372.     {
  373.     backspaced = -1;
  374.     }
  375.     else if (p_dg)
  376.     {
  377.     if (backspaced >= 0)
  378.         c = getdigraph(backspaced, c, FALSE);
  379.     backspaced = -1;
  380.     if ((c == K_BS || c == Ctrl('H')) && lastchar >= 0)
  381.         backspaced = lastchar;
  382.     }
  383.     lastchar = c;
  384.     return c;
  385. }
  386.  
  387. /*
  388.  * Lookup the pair char1, char2 in the digraph tables.
  389.  * If no match, return char2.
  390.  */
  391.     static int
  392. getexactdigraph(char1, char2, meta)
  393.     int        char1;
  394.     int        char2;
  395.     int        meta;
  396. {
  397.     int        i;
  398.     int        retval;
  399.  
  400.     if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
  401.     return char2;
  402.     retval = 0;
  403.     for (i = 0; ; ++i)        /* search added digraphs first */
  404.     {
  405.     if (i == digraphcount)    /* end of added table, search defaults */
  406.     {
  407.         for (i = 0; digraphdefault[i][0] != 0; ++i)
  408.         if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
  409.         {
  410.             retval = digraphdefault[i][2];
  411.             break;
  412.         }
  413.         break;
  414.     }
  415.     if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  416.     {
  417.         retval = digraphnew[i][2];
  418.         break;
  419.     }
  420.     }
  421.  
  422.     if (retval == 0)        /* digraph deleted or not found */
  423.     {
  424.     if (char1 == ' ' && meta)    /* <space> <char> --> meta-char */
  425.         return (char2 | 0x80);
  426.     return char2;
  427.     }
  428.     return retval;
  429. }
  430.  
  431. /*
  432.  * Get digraph.
  433.  * Allow for both char1-char2 and char2-char1
  434.  */
  435.     int
  436. getdigraph(char1, char2, meta)
  437.     int    char1;
  438.     int    char2;
  439.     int    meta;
  440. {
  441.     int        retval;
  442.  
  443.     if (((retval = getexactdigraph(char1, char2, meta)) == char2) &&
  444.                                (char1 != char2) &&
  445.             ((retval = getexactdigraph(char2, char1, meta)) == char1))
  446.     return char2;
  447.     return retval;
  448. }
  449.  
  450. /*
  451.  * put the digraphs in the argument string in the digraph table
  452.  * format: {c1}{c2} char {c1}{c2} char ...
  453.  */
  454.     void
  455. putdigraph(str)
  456.     char_u *str;
  457. {
  458.     int        char1, char2, n;
  459.     char_u  (*newtab)[3];
  460.     int        i;
  461.  
  462.     while (*str)
  463.     {
  464.     str = skipwhite(str);
  465.     if ((char1 = *str++) == 0 || (char2 = *str++) == 0)
  466.         return;
  467.     if (char1 == ESC || char2 == ESC)
  468.     {
  469.         EMSG("Escape not allowed in digraph");
  470.         return;
  471.     }
  472.     str = skipwhite(str);
  473.     if (!isdigit(*str))
  474.     {
  475.         emsg(e_number);
  476.         return;
  477.     }
  478.     n = getdigits(&str);
  479.     if (digraphnew)        /* search the table for existing entry */
  480.     {
  481.         for (i = 0; i < digraphcount; ++i)
  482.         if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  483.         {
  484.             digraphnew[i][2] = n;
  485.             break;
  486.         }
  487.         if (i < digraphcount)
  488.         continue;
  489.     }
  490.     newtab = (char_u (*)[3])alloc(digraphcount * 3 + 3);
  491.     if (newtab)
  492.     {
  493.         vim_memmove(newtab, digraphnew, (size_t)(digraphcount * 3));
  494.         vim_free(digraphnew);
  495.         digraphnew = newtab;
  496.         digraphnew[digraphcount][0] = char1;
  497.         digraphnew[digraphcount][1] = char2;
  498.         digraphnew[digraphcount][2] = n;
  499.         ++digraphcount;
  500.     }
  501.     }
  502. }
  503.  
  504.     void
  505. listdigraphs()
  506. {
  507.     int        i;
  508.  
  509.     msg_putchar('\n');
  510.     printdigraph(NULL);
  511.     for (i = 0; digraphdefault[i][0] && !got_int; ++i)
  512.     {
  513.     if (getexactdigraph(digraphdefault[i][0], digraphdefault[i][1],
  514.                            FALSE) == digraphdefault[i][2])
  515.         printdigraph(digraphdefault[i]);
  516.     ui_breakcheck();
  517.     }
  518.     for (i = 0; i < digraphcount && !got_int; ++i)
  519.     {
  520.     printdigraph(digraphnew[i]);
  521.     ui_breakcheck();
  522.     }
  523.     must_redraw = CLEAR;    /* clear screen, because some digraphs may be
  524.                    wrong, in which case we messed up NextScreen */
  525. }
  526.  
  527.     static void
  528. printdigraph(p)
  529.     char_u *p;
  530. {
  531.     char_u    buf[9];
  532.     static int    len;
  533.  
  534.     if (p == NULL)
  535.     len = 0;
  536.     else if (p[2] != 0)
  537.     {
  538.     if (len > Columns - 11)
  539.     {
  540.         msg_putchar('\n');
  541.         len = 0;
  542.     }
  543.     if (len)
  544.         MSG_PUTS("   ");
  545.     sprintf((char *)buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
  546.     msg_puts(buf);
  547.     len += 11;
  548.     }
  549. }
  550.  
  551. #endif /* DIGRAPHS */
  552.